package org.nfIt.service.impl;

import com.alibaba.fastjson.JSON;
import org.nfIt.entity.product.Category;
import org.nfIt.mapper.CategoryMapper;
import org.nfIt.service.CategoryService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cache.annotation.Cacheable;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Service;
import org.springframework.util.StringUtils;

import java.util.List;
import java.util.concurrent.TimeUnit;
import java.util.stream.Collectors;

/**
 * ClossName:CategoryServiceImpl
 * Pakage:org.nfIt.service.impl
 * Description
 *h5分类实现类
 * @Author L
 * @Create 2024/9/18 20:20
 * @Version 2023.1.3
 */
@Service
public class CategoryServiceImpl implements CategoryService {
    @Autowired
    private CategoryMapper categoryMapper;

    @Autowired
    private RedisTemplate<String,String> redisTemplate;

    /**
     * 查询一级分类
     *
     * 一级分类的key - category:one
     *
     */
    @Override
    public List<Category> findOneCategory() {

        //1）查询redis,是否有所有的一级分类
        String  categoryOneJson  = redisTemplate.opsForValue().get("category:one");
        //2）如果redis中包含所有一级分类直接返回
        if(!StringUtils.isEmpty(categoryOneJson)) {
            //不等于空,把数据转换成list集合并把进行数据返回
            List<Category> categoryOneList = JSON.parseArray(categoryOneJson, Category.class);
            return categoryOneList;
        }

        //3）如果redis没有包含一级分类，查询数据库，把数据库中的数据返回，把返回的数据存到redis中
        List<Category> categoryOneList = categoryMapper.findOneCategory();
        //把返回的数据存到redis中,设置过期时间为7天
        redisTemplate.opsForValue().set("category:one",JSON.toJSONString(categoryOneList),7, TimeUnit.DAYS);
        return categoryOneList;
    }

    /**
     * 查询所有分类,树形封装
     *
     * 实现分类思路：
     *  1）：怎么表示它是第一层？第二层？第三层？
     *  使用 category表的id字段和 category表的parent_id字段表示
     *  一级分类 ：parent_id=0
     *  二级分类 ： 一级分类id = parent_id
     *  三级分类 ： 二级分类id = parent_id
     *' @Cacheable(value = "category" ,key = "'all'") :构建成redis中的key - category::all
     */
    @Cacheable(value = "category" ,key = "'all'")
    @Override
    public List<Category> findCategoryTree() {

        //1）查询所有分类，返回list集合
        List<Category> allCategoryList = categoryMapper.findCategoryAll();

        //2） 遍历所有分类list集合，通过条件parent_id=0得到所有一级分类
        List<Category> oneCategoryList = allCategoryList.stream()
                                                                .filter(item -> item.getParentId().longValue() == 0) //条件过滤
                                                                .collect(Collectors.toList()); //添加到新的list集合中
//        System.out.println("一级分类=="+oneCategoryList);

        //3) 遍历所有一级分类list集合，条件判断:id=parent_id，得到一级下面的二级分类
        oneCategoryList.forEach(oneCategory ->{
            List<Category> twoCategoryList = allCategoryList.stream()
                    // ,再遍历一级分类的 id == parent_id就是二级分类
                    .filter(item -> item.getParentId() == oneCategory.getId())
                    .collect(Collectors.toList());
            //把二级分类封装到一级分类里
            oneCategory.setChildren(twoCategoryList);

            //4） 遍历所有二级分类,条件判断:id = parent_id，得到二级下面三级分类
            twoCategoryList.forEach(twoCatego ->{
                List<Category> threeCategoryList = allCategoryList.stream()
                                                         .filter(item -> item.getParentId() == twoCatego.getId())
                                                         .collect(Collectors.toList());

                //把三级分类封装到二级分类里
                twoCatego.setChildren(threeCategoryList);
            });
        });

        return oneCategoryList;
    }
}
